home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
utility
/
328
/
v_m_ops.inc
< prev
Wrap
Text File
|
1988-10-29
|
68KB
|
2,115 lines
/***************************************************************************
V_M_OPS.INC
All 6502 simulation code is in this file
December 31, 1986 0:00
***************************************************************************/
/* format of the mnemonics: 3 ascii codes of th opcode and the addressing mode:
00 - implied 01 - immediate 02 - zero page 03 - zero page,x
04 - zero page,y 05 - (zero page,x) 06 - (zero page),y
07 - absolute 08 - absolute,x 09 - absolute,y 0A - accumulator
0B - relative 0C - indirect 0D - absolute indirect
*/
long mnemonics[256] = {
0x42524B00L, 0x4F524105L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524102L,
0x41534C02L, 0x3F3F3F00L, 0x50485000L, 0x4F524101L, 0x41534C0AL, 0x3F3F3F00L,
0x3F3F3F00L, 0x4F524107L, 0x41534C07L, 0x3F3F3F00L, 0x42504C0BL, 0x4F524106L,
0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524103L, 0x41534C03L, 0x3F3F3F00L,
0x434C4300L, 0x4F524109L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524108L,
0x41534C08L, 0x3F3F3F00L, 0x4A535207L, 0x414E4405L, 0x3F3F3F00L, 0x3F3F3F00L,
0x42495402L, 0x414E4402L, 0x524F4C02L, 0x3F3F3F00L, 0x504C5000L, 0x414E4401L,
0x524F4C0AL, 0x3F3F3F00L, 0x42495407L, 0x414E4407L, 0x524F4C07L, 0x3F3F3F00L,
0x424D490BL, 0x414E4406L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4403L,
0x524F4C03L, 0x3F3F3F00L, 0x53454300L, 0x414E4409L, 0x3F3F3F00L, 0x3F3F3F00L,
0x3F3F3F00L, 0x414E4408L, 0x524F4C08L, 0x3F3F3F00L, 0x52544900L, 0x454F5205L,
0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5202L, 0x4C535202L, 0x3F3F3F00L,
0x50484100L, 0x454F5201L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5207L,
0x4C535207L, 0x3F3F3F00L, 0x4256430BL, 0x454F5206L, 0x3F3F3F00L, 0x3F3F3F00L,
0x3F3F3F00L, 0x454F5203L, 0x4C535203L, 0x3F3F3F00L, 0x434C4900L, 0x454F5209L,
0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5208L, 0x4C535208L, 0x3F3F3F00L,
0x52545300L, 0x41444305L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444302L,
0x524F5202L, 0x3F3F3F00L, 0x504C4100L, 0x41444301L, 0x524F520AL, 0x3F3F3F00L,
0x4A4D500CL, 0x41444307L, 0x524F5207L, 0x3F3F3F00L, 0x4256530BL, 0x41444306L,
0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444303L, 0x524F5203L, 0x3F3F3F00L,
0x53454900L, 0x41444309L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444308L,
0x524F5208L, 0x3F3F3F00L, 0X3F3F3F00L, 0X53544105L, 0X3F3F3F00L, 0X3F3F3F00L,
0X53545902L, 0X53544102L, 0X53545802L, 0X3F3F3F00L, 0X44455900L, 0X3F3F3F00L,
0X54584100L, 0X3F3F3F00L, 0X53545907L, 0X53544107L, 0X53545807L, 0X3F3F3F00L,
0X4243430BL, 0X53544106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545903L, 0X53544103L,
0X53545804L, 0X3F3F3F00L, 0X54594100L, 0X53544109L, 0X54585300L, 0X3F3F3F00L,
0X3F3F3F00L, 0X53544108L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445901L, 0X4C444105L,
0X4C445801L, 0X3F3F3F00L, 0X4C445902L, 0X4C444102L, 0X4C445802L, 0X3F3F3F00L,
0X54415900L, 0X4C444101L, 0X54415800L, 0X3F3F3F00L, 0X4C445907L, 0X4C444107L,
0X4C445807L, 0X3F3F3F00L, 0X4243530BL, 0X4C444106L, 0X3F3F3F00L, 0X3F3F3F00L,
0X4C445903L, 0X4C444103L, 0X4C445804L, 0X3F3F3F00L, 0X434C5600L, 0X4C444109L,
0X54535800L, 0X3F3F3F00L, 0X4C445908L, 0X4C444108L, 0X4C445809L, 0X3F3F3F00L,
0X43505901L, 0X434D5005L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505902L, 0X434d5002L,
0X44454302L, 0X3F3F3F00L, 0X494E5900L, 0X434D5001L, 0X44455800L, 0X3F3F3F00L,
0X43505907L, 0X434D5007L, 0X44454307L, 0X3F3F3F00L, 0X424E450BL, 0X434D5006L,
0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5003L, 0X44454303L, 0X3F3F3F00L,
0X434C4400L, 0X434D5009L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5008L,
0X44454308L, 0X3F3F3F00L, 0X43505801L, 0X53424305L, 0X3F3F3F00L, 0X3F3F3F00L,
0X43505802L, 0X53424302L, 0X494E4302L, 0X3F3F3F00L, 0X494E5800L, 0X53424301L,
0X4E4F5000L, 0X3F3F3F00L, 0X43505807L, 0X53424307L, 0X494E4307L, 0X3F3F3F00L,
0X4245510BL, 0X53424306L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424303L,
0X494E4303L, 0X3F3F3F00L, 0X53454400L, 0X53424309L, 0X3F3F3F00L, 0X3F3F3F00L,
0X3F3F3F00L, 0X53424308L, 0X494E4308L, 0X3F3F3F00L
} ;
/* tell Megamax that the emulation routines will be found in inline code: */
extern
op00(), op01(), op02(), op03(), op04(), op05(), op06(), op07(), op08(),
op09(),op0A(),op0B(), op0C(), op0D(), op0E(), op0F(), op10(), op11(), op12(),
op13(), op14(), op15(), op16(), op17(), op18(), op19(), op1A(), op1B(),
op1C(), op1D(), op1E(), op1F(), op20(), op21(), op22(), op23(), op24(),
op25(), op26(), op27(), op28(), op29(), op2A(), op2B(), op2C(), op2D(),
op2E(), op2F(), op30(), op31(), op32(), op33(), op34(), op35(), op36(),
op37(), op38(), op39(), op3A(), op3B(), op3C(), op3D(), op3E(), op3F(),
op40(), op41(), op42(), op43(), op44(), op45(), op46(), op47(), op48(),
op49(), op4A(), op4B(), op4C(), op4D(), op4E(), op4F(), op50(), op51(),
op52(), op53(), op54(), op55(), op56(), op57(), op58(), op59(), op5A(),
op5B(), op5C(), op5D(), op5E(), op5F(), op60(), op61(), op62(), op63(),
op64(), op65(), op66(), op67(), op68(), op69(), op6A(), op6B(), op6C(),
op6D(), op6E(), op6F(), op70(), op71(), op72(), op73(), op74(), op75(),
op76(), op77(), op78(), op79(), op7A(), op7B(), op7C(), op7D(), op7E(),
op7F(), op80(), op81(), op82(), op83(), op84(), op85(), op86(), op87(),
op88(), op89(), op8A(), op8B(), op8C(), op8D(), op8E(), op8F(), op90(),
op91(), op92(), op93(), op94(), op95(), op96(), op97(), op98(), op99(),
op9A(), op9B(), op9C(), op9D(), op9E(), op9F(), opA0(), opA1(), opA2(),
opA3(), opA4(), opA5(), opA6(), opA7(), opA8(), opA9(), opAA(), opAB(),
opAC(), opAD(), opAE(), opAF(), opB0(), opB1(), opB2(), opB3(), opB4(),
opB5(), opB6(), opB7(), opB8(), opB9(), opBA(), opBB(), opBC(), opBD(),
opBE(), opBF(), opC0(), opC1(), opC2(), opC3(), opC4(), opC5(), opC6(),
opC7(), opC8(), opC9(), opCA(), opCB(), opCC(), opCD(), opCE(), opCF(),
opD0(), opD1(), opD2(), opD3(), opD4(), opD5(), opD6(), opD7(), opD8(),
opD9(), opDA(), opDB(), opDC(), opDD(), opDE(), opDF(), opE0(), opE1(),
opE2(), opE3(), opE4(), opE5(), opE6(), opE7(), opE8(), opE9(), opEA(),
opEB(), opEC(), opED(), opEE(), opEF(), opF0(), opF1(), opF2(), opF3(),
opF4(), opF5(), opF6(), opF7(), opF8(), opF9(), opFA(), opFB(), opFC(),
opFD(), opFE(), opFF() ;
int (*vec_6502[256])() = { /* create an array of pointers to 256 functions */
op00, op01, op02, op03, op04, op05, op06, op07, op08,
op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12,
op13, op14, op15, op16, op17, op18, op19, op1A, op1B,
op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24,
op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D,
op2E, op2F, op30, op31, op32, op33, op34, op35, op36,
op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F,
op40, op41, op42, op43, op44, op45, op46, op47, op48,
op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51,
op52, op53, op54, op55, op56, op57, op58, op59, op5A,
op5B, op5C, op5D, op5E, op5F, op60, op61, op62, op63,
op64, op65, op66, op67, op68, op69, op6A, op6B, op6C,
op6D, op6E, op6F, op70, op71, op72, op73, op74, op75,
op76, op77, op78, op79, op7A, op7B, op7C, op7D, op7E,
op7F, op80, op81, op82, op83, op84, op85, op86, op87,
op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90,
op91, op92, op93, op94, op95, op96, op97, op98, op99,
op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2,
opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB,
opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4,
opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD,
opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6,
opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF,
opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8,
opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1,
opE2, opE3, opE4, opE5, opE6, opE7, opE8, opE9, opEA,
opEB, opEC, opED, opEE, opEF, opF0, opF1, opF2, opF3,
opF4, opF5, opF6, opF7, opF8, opF9, opFA, opFB, opFC,
opFD, opFE, opFF } ;
execute() {
asm {
MOVEM.L D0-D7/A0-A3/A5,-(SP) /* save enviornment */
CLR.L D0 /* clear everything just to be safe */
CLR.L D1
CLR.L D2
CLR.L D3
CLR.L D4
CLR.L D5
CLR.L D6
CLR.L D7
/* convert P register NV_BDIZC
to CCR register BDIXNZVC */
MOVE.B p(GLOBAL),REGST
MOVE.B REGST,DBUS /* BDI */
MOVE.B REGST,REGA /* N */
MOVE.B REGST,REGX /* V */
MOVE.B REGST,REGY /* Z */
MOVE.B REGST,REGEA /* set X equal to C */
ASL.B #3,DBUS
AND.B #0xE0,DBUS /* BDI_____ */
ASL.B #4,REGEA
AND.B #BITX,REGEA /* ___X____ */
ASL.B #1,REGY
AND.B #BITZ,REGY /* _____Z__ */
ASR.B #4,REGA
AND.B #BITN,REGA /* ____N___ */
ASR.B #5,REGX
AND.B #BITV,REGX /* ______V_ */
MOVE.B REGEA,REGST
OR.B REGX,REGST
OR.B REGY,REGST
OR.B REGA,REGST
OR.B DBUS,REGST /* that gets BDIXNZVC !!! */
MOVE.B a(GLOBAL),REGA /* load 6502 registers */
MOVE.B x(GLOBAL),REGX
MOVE.B y(GLOBAL),REGY
MOVE.W #0x100,REGSP
MOVE.B sp(GLOBAL),REGSP /* stack is on page 1 */
MOVE.W pc(GLOBAL),REGPC
LEA exit_emul,REGEMUL
MOVE.L REGEMUL,exitptr(GLOBAL) /* pointer to exit_emul */
LEA emul,REGEMUL /* pointer to emulator */
TST.B trace(GLOBAL)
BEQ notrace /* if trace bit set... */
LEA exit_emul,REGEMUL /* divert to exit routine */
notrace:
LEA vec_6502(GLOBAL),REGOPS /* pointer to table */
MOVE.L mem(GLOBAL),REGMEA /* pointer to mem[ea] */
MOVE.L stat(GLOBAL),REGSTAT
MOVE.L REGMEA,REGEA
ADD.L REGMEA,REGPC /* pointer to mem[pc] */
MOVE.L REGPC,REGMPC
} /* fall through into emulator */
emul:
asm {
CLR.W IR /* 4 clock cycles */
MOVE.B (REGMPC)+,IR /* 8 clock cycles */
ADD.W IR,IR /* 4 clock cycles */
ADD.W IR,IR /* 4 clock cycles */
MOVE.L 0(REGOPS,IR.W),REGMEA /* 15-20 clock cycles */
JMP (REGMEA) /* 8 clock cycles */
}
exit_emul:
asm {
MOVE.B REGA,a(GLOBAL) /* save 6502 registers */
MOVE.B REGX,x(GLOBAL)
MOVE.B REGY,y(GLOBAL)
MOVE.B REGSP,sp(GLOBAL)
MOVE.W REGMPC,pc(GLOBAL)
MOVE.W REGMEA,ea(GLOBAL)
/* convert CCR register BDIXNZVC
to P register NV_BDIZC */
MOVE.B REGST,DBUS /* BDI */
MOVE.B REGST,REGA /* N */
MOVE.B REGST,REGX /* V */
MOVE.B REGST,REGY /* Z */
MOVE.B REGST,REGEA /* C */
ASR.B #3,DBUS
AND.B #0x1C,DBUS /* ___BDI__ */
ASR.B #4,REGEA
AND.B #CBIT,REGEA /* _______C */
ASR.B #1,REGY
AND.B #ZBIT,REGY /* ______Z_ */
ASL.B #4,REGA
AND.B #NBIT,REGA /* N_______ */
ASL.B #5,REGX
AND.B #VBIT,REGX /* _V______ */
MOVE.B REGEA,REGST
OR.B REGX,REGST
OR.B REGY,REGST
OR.B REGA,REGST
OR.B DBUS,REGST /* that gets NV_BDIZC !!! */
MOVE.B REGST,p(GLOBAL)
MOVEM.L (SP)+,D0-D7/A0-A3/A5 /* restore enviornment */
}
return(0) ; /* and get outta here! */
asm { /* 256 emulation routines go here */
/* but first, some common code: */
/* at entry, all common routines have REGEA loaded */
doOR:
MOVE.B 0(REGSTAT,REGEA.W),IR /* get status byte */
BPL ORread /* if OK to read memory do so */
SETREAD /* else set read flag */
BSR emul_serv /* and call service routine */
ORread:
MOVE.L REGEA,REGMEA
OR.B (REGMEA),REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doAND: /* ditto */
MOVE.B 0(REGSTAT,REGEA.W),IR
BPL ANDread
SETREAD
BSR emul_serv
ANDread:
MOVE.L REGEA,REGMEA
AND.B (REGMEA),REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doEOR:
MOVE.B 0(REGSTAT,REGEA.W),IR
BPL EORread
SETREAD
BSR emul_serv
EORread:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS /* stupid 68000 limitation */
EOR.B DBUS,REGA /* makes you do it in 2 steps */
MOVE.W SR,DBUS /* argghhhhh!!! */
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doINC:
MOVE.L REGEA,REGMEA
ADDQ.B #1,(REGMEA)
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doDEC:
MOVE.L REGEA,REGMEA
SUBQ.B #1,(REGMEA)
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doLDA:
MOVE.B 0(REGSTAT,REGEA.W),IR
BPL LDAread
SETREAD
BSR emul_serv
LDAread:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doLDX:
MOVE.B 0(REGSTAT,REGEA.W),IR
BPL LDXread
SETREAD
BSR emul_serv
LDXread:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),REGX
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doLDY:
MOVE.B 0(REGSTAT,REGEA.W),IR
BPL LDYread
SETREAD
BSR emul_serv
LDYread:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),REGY
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doSTA:
MOVE.B 0(REGSTAT,REGEA.W),IR
BEQ STAwrite
SETWRITE
SWAP DBUS
MOVE.B REGA,DBUS
SWAP DBUS
BRA emul_serv
STAwrite:
MOVE.L REGEA,REGMEA
MOVE.B REGA,(REGMEA)
JMP (REGEMUL)
doSTX:
MOVE.B 0(REGSTAT,REGEA.W),IR
BEQ STXwrite
SETWRITE
SWAP DBUS
MOVE.B REGX,DBUS
SWAP DBUS
BRA emul_serv
STXwrite:
MOVE.L REGEA,REGMEA
MOVE.B REGX,(REGMEA)
JMP (REGEMUL)
doSTY:
MOVE.B 0(REGSTAT,REGEA.W),IR
BEQ STYwrite
SETWRITE
SWAP DBUS
MOVE.B REGY,DBUS
SWAP DBUS
BRA emul_serv
STYwrite:
MOVE.L REGEA,REGMEA
MOVE.B REGY,(REGMEA)
JMP (REGEMUL)
doADC:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
ORI.B #BITZ,REGST /* ADDX doesn't set Z flag */
MOVE.B REGST,CCR /* so prepare C bit */
ADDX.B DBUS,REGA /* BUG!! BUG!! no decimal mode yet!! */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITV|BITX),DBUS
AND.B #~(BITN|BITZ|BITV|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doSBC:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
EORI.B #BITX,REGST /* different than 6502 */
ORI.B #BITZ,REGST /* SUBX doesn't set Z flag */
MOVE.B REGST,CCR
SUBX.B DBUS,REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX|BITV),DBUS
EORI.B #BITX,DBUS
AND.B #~(BITN|BITZ|BITX|BITV),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doROL:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),IR /* get byte */
MOVE.B REGST,CCR
ROXL.B #1,IR /* shift it */
MOVE.B IR,(REGMEA) /* save in memory */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doROR:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),IR
MOVE.B REGST,CCR
ROXR.B #1,IR
MOVE.B IR,(REGMEA)
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doASL:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),IR
ASL.B #1,IR
MOVE.B IR,(REGMEA)
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
doLSR:
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),IR
LSR.B #1,IR
MOVE.B IR,(REGMEA)
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
/* here are the actual 256 emulation routines: */
op00: OR.B #BITB,REGST
BRA exit_emul
op01: CLR.W REGEA /* ORA (zp,X) */
MOVE.B (REGMPC)+,REGEA /* get zero page address */
ADD.B REGX,REGEA /* wraparound to zero page again */
MOVE.L REGEA,REGMEA /* effective address calculated */
MOVE.B 1(REGMEA),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 (neat huh?) */
MOVE.B (REGMEA),REGEA /* get lo byte */
BRA doOR /* go to common ORing routine */
op02: JMP (REGEMUL)
op03: JMP (REGEMUL)
op04: JMP (REGEMUL)
op05: CLR.W REGEA /* ORA zp */
MOVE.B (REGMPC)+,REGEA /* ditto */
BRA ORread
op06: CLR.W REGEA /* ASL zp */
MOVE.B (REGMPC)+,REGEA
BRA doASL
op07: JMP (REGEMUL)
op08: /* PHP */
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVEM.L DBUS/REGST/REGA/REGX/REGY/REGEA,-(SP)
/* convert CCR register BDIXNZVC
to P register NV_BDIZC */
MOVE.B REGST,DBUS /* BDI */
MOVE.B REGST,REGA /* N */
MOVE.B REGST,REGX /* V */
MOVE.B REGST,REGY /* Z */
MOVE.B REGST,REGEA /* C */
ASR.B #3,DBUS
AND.B #0x1C,DBUS /* ___BDI__ */
ASR.B #4,REGEA
AND.B #CBIT,REGEA /* _______C */
ASR.B #1,REGY
AND.B #ZBIT,REGY /* ______Z_ */
ASL.B #4,REGA
AND.B #NBIT,REGA /* N_______ */
ASL.B #5,REGX
AND.B #VBIT,REGX /* _V______ */
MOVE.B REGEA,REGST
OR.B REGX,REGST
OR.B REGY,REGST
OR.B REGA,REGST
OR.B DBUS,REGST /* that gets NV_BDIZC !!! */
ORI.B #0x20,REGST /* and then NV1BDIZC */
MOVE.B REGST,(REGMEA) /* push processor */
MOVEM.L (SP)+,DBUS/REGST/REGA/REGX/REGY/REGEA
SUBQ.B #1,REGSP
JMP (REGEMUL)
op09: OR.B (REGMPC)+,REGA /* ORA # */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op0A: /* ASL A */
ASL.B #1,REGA /* shift it */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op0B: JMP (REGEMUL)
op0C: JMP (REGEMUL)
op0D: /* ORA abs */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADDQ.W #2,REGMPC
BRA doOR
op0E: /* ASL abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doASL
op0F: JMP (REGEMUL)
op10: BTST #3,REGST /* BPL */
BNE nobpl /* BITN = 0x08 = bit #3 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobpl:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
op11: CLR.W REGEA /* ORA (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMEA),REGEA /* get lo byte */
ADD.W REGY,REGEA
BRA doOR
op12: JMP (REGEMUL)
op13: JMP (REGEMUL)
op14: JMP (REGEMUL)
op15: CLR.W REGEA /* ORA zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA /* wraparpund */
BRA ORread
op16: CLR.W REGEA /* ASL zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doASL
op17: JMP (REGEMUL)
op18: ANDI.B #~BITX,REGST /* CLC */
JMP (REGEMUL)
op19: /* ORA abs,Y */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doOR
op1A: JMP (REGEMUL)
op1B: JMP (REGEMUL)
op1C: JMP (REGEMUL)
op1D: /* ORA abs,X */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doOR
op1E: /* ASL abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doASL
op1F: JMP (REGEMUL)
op20: SUBQ.B #2,REGSP /* JSR abs */
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVE.W REGMPC,REGPC
ADDQ.W #1,REGPC
MOVE.B REGPC,1(REGMEA) /* push PClo */
MOVE.W REGPC,-(SP)
MOVE.B (SP)+,2(REGMEA) /* push PChi */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGPC
MOVE.B (REGMPC),REGPC
MOVE.L REGPC,REGMPC
JMP (REGEMUL)
op21: CLR.W REGEA /* AND (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
BRA doAND
op22: JMP (REGEMUL)
op23: JMP (REGEMUL)
op24: CLR.W REGEA /* BIT zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
TST.B (REGMEA) /* V bit not set!!!! */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ|BITV),REGST
OR.B DBUS,REGST
MOVE.B (REGMEA),DBUS
LSR.B #5,DBUS /* shift V bit into position */
AND.B #(BITV),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
op25: CLR.W REGEA /* AND zp */
MOVE.B (REGMPC)+,REGEA
BRA ANDread
op26: CLR.W REGEA /* ROL zp */
MOVE.B (REGMPC)+,REGEA
BRA doROL
op27: JMP (REGEMUL)
op28: /* PLP */
ADDQ.B #1,REGSP
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),REGST
MOVEM.L DBUS/REGA/REGX/REGY/REGEA,-(SP)
/* convert P register NV_BDIZC
to CCR register BDIXNZVC */
MOVE.B REGST,DBUS /* BDI */
MOVE.B REGST,REGA /* N */
MOVE.B REGST,REGX /* V */
MOVE.B REGST,REGY /* Z */
MOVE.B REGST,REGEA /* set X equal to C */
ASL.B #3,DBUS
AND.B #0xE0,DBUS /* BDI_____ */
ASL.B #4,REGEA
AND.B #BITX,REGEA /* ___X____ */
ASL.B #1,REGY
AND.B #BITZ,REGY /* _____Z__ */
ASR.B #4,REGA
AND.B #BITN,REGA /* ____N___ */
ASR.B #5,REGX
AND.B #BITV,REGX /* ______V_ */
MOVE.B REGEA,REGST
OR.B REGX,REGST
OR.B REGY,REGST
OR.B REGA,REGST
OR.B DBUS,REGST /* that gets BDIXNZVC !!! */
MOVEM.L (SP)+,DBUS/REGA/REGX/REGY/REGEA
JMP (REGEMUL)
op29: AND.B (REGMPC)+,REGA /* AND # */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op2A: /* ROL A */
MOVE.B REGST,CCR /* prepare X bit */
ROXL.B #1,REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op2B: JMP (REGEMUL)
op2C: /* BIT abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
MOVE.B 0(REGSTAT,REGEA.W),IR
BPL BITread
SETREAD
BSR emul_serv
BITread:
MOVE.L REGEA,REGMEA
TST.B (REGMEA) /* BUG!! BUG!!! V bit not set!!!! */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op2D: /* AND abs */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADDQ.W #2,REGMPC
BRA doAND
op2E: /* ROL abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doROL
op2F: JMP (REGEMUL)
op30: BTST #3,REGST /* BMI */
BEQ nobmi /* BITN = 0x08 = bit #3 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobmi:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
op31: CLR.W REGEA /* AND (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
ADD.W REGY,REGEA
BRA doAND
op32: JMP (REGEMUL)
op33: JMP (REGEMUL)
op34: JMP (REGEMUL)
op35: CLR.W REGEA /* AND zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA ANDread
op36: CLR.W REGEA /* ROL zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doROL
op37: JMP (REGEMUL)
op38: ORI.B #BITX,REGST /* SEC */
JMP (REGEMUL)
op39: /* AND abs,Y */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doAND
op3A: JMP (REGEMUL)
op3B: JMP (REGEMUL)
op3C: JMP (REGEMUL)
op3D: /* AND abs,X */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doAND
op3E: /* ROL abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doROL
op3F: JMP (REGEMUL)
op40: /* RTI */
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),REGPC /* pull PClo */
MOVE.B 2(REGMEA),-(SP) /* pull PChi */
MOVE.W (SP)+,REGPC
MOVE.B 3(REGMEA),REGST /* pull processor */
ADDQ.B #3,REGSP
ADDQ.W #1,REGPC
MOVE.L REGPC,REGMPC
JMP (REGEMUL)
op41: CLR.W REGEA /* EOR (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
BRA doEOR
op42: JMP (REGEMUL)
op43: JMP (REGEMUL)
op44: JMP (REGEMUL)
op45: CLR.W REGEA /* EOR zp */
MOVE.B (REGMPC)+,REGEA
BRA EORread
op46: CLR.W REGEA /* LSR zp */
MOVE.B (REGMPC)+,REGEA
BRA doLSR
op47: JMP (REGEMUL)
op48: /* PHA */
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGA,(REGMEA) /* push acc */
SUBQ.B #1,REGSP
JMP (REGEMUL)
op49: MOVE.B (REGMPC)+,DBUS /* EOR # */
EOR.B DBUS,REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op4A: /* LSR A */
LSR.B #1,REGA /* shift it */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op4B: JMP (REGEMUL)
op4C: /* JMP abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGPC
MOVE.B (REGMPC),REGPC
MOVE.L REGPC,REGMPC
JMP (REGEMUL)
op4D: /* EOR abs */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADDQ.W #2,REGMPC
BRA doEOR
op4E: /* LSR abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doLSR
op4F: JMP (REGEMUL)
op50: BTST #1,REGST /* BVC */
BNE nobvc /* BITV = 0x02 = bit #1 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobvc:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
op51: CLR.W REGEA /* EOR (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMEA),REGEA /* get lo byte */
ADD.W REGY,REGEA
BRA doEOR
op52: JMP (REGEMUL)
op53: JMP (REGEMUL)
op54: JMP (REGEMUL)
op55: CLR.W REGEA /* EOR zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA EORread
op56: CLR.W REGEA /* LSR zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doLSR
op57: JMP (REGEMUL)
op58: ANDI.B #~BITI,REGST /* CLI */
JMP (REGEMUL)
op59: /* EOR abs,Y */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doEOR
op5A: JMP (REGEMUL)
op5B: JMP (REGEMUL)
op5C: JMP (REGEMUL)
op5D: /* EOR abs,X */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doEOR
op5E: /* LSR abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doLSR
op5F: JMP (REGEMUL)
op60: /* RTS */
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 2(REGMEA),-(SP) /* pull PChi */
MOVE.W (SP)+,REGPC
MOVE.B 1(REGMEA),REGPC /* pull PClo */
ADDQ.B #2,REGSP
ADDQ.W #1,REGPC
MOVE.L REGPC,REGMPC
JMP (REGEMUL)
op61: CLR.W REGEA /* ADC (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
BRA doADC
op62: JMP (REGEMUL)
op63: JMP (REGEMUL)
op64: JMP (REGEMUL)
op65: CLR.W REGEA /* ADC zp */
MOVE.B (REGMPC)+,REGEA
BRA doADC
op66: CLR.W REGEA /* ROR zp */
MOVE.B (REGMPC)+,REGEA
BRA doROR
op67: JMP (REGEMUL)
op68: /* PLA */
ADDQ.B #1,REGSP
MOVE.W REGSP,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op69: MOVE.B (REGMPC)+,DBUS /* ADC # */
ORI.B #BITZ,REGST /* SUBX doesn't set Z flag */
MOVE.B REGST,CCR
ADDX.B DBUS,REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX|BITV),DBUS
AND.B #~(BITN|BITZ|BITX|BITV),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op6A: /* ROR A */
MOVE.B REGST,CCR /* prepare carry bit */
ROXR.B #1,REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS /* update flags N Z C */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op6B: JMP (REGEMUL)
op6C: /* JMP (abs) */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGPC
MOVE.B (REGMPC),REGPC
MOVE.W REGPC,REGEA /* get vector */
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGPC
MOVE.B (REGMEA),REGPC
MOVE.L REGPC,REGMPC
JMP (REGEMUL)
op6D: /* ADC abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doADC
op6E: /* ROR abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doROR
op6F: JMP (REGEMUL)
op70: BTST #1,REGST /* BVS */
BEQ nobvs /* BITV = 0x02 = bit #1 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobvs:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
op71: CLR.W REGEA /* ADC (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
ADD.W REGY,REGEA
BRA doADC
op72: JMP (REGEMUL)
op73: JMP (REGEMUL)
op74: JMP (REGEMUL)
op75: CLR.W REGEA /* ADC zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doADC
op76: CLR.W REGEA /* ROR zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doROR
op77: JMP (REGEMUL)
op78: ORI.B #BITX,REGST /* SEC */
JMP (REGEMUL)
op79: /* ADC abs,Y */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doADC
op7A: JMP (REGEMUL)
op7B: JMP (REGEMUL)
op7C: JMP (REGEMUL)
op7D: /* ADC abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doADC
op7E: /* ROR abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doROR
op7F: JMP (REGEMUL)
op80: JMP (REGEMUL)
op81: CLR.W REGEA /* STA (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
BRA doSTA
op82: JMP (REGEMUL)
op83: JMP (REGEMUL)
op84: CLR.W REGEA /* STY zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGY,(REGMEA)
JMP (REGEMUL)
op85: CLR.W REGEA /* STA zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGA,(REGMEA)
JMP (REGEMUL)
op86: CLR.W REGEA /* STX zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGX,(REGMEA)
JMP (REGEMUL)
op87: JMP (REGEMUL)
op88: SUBQ.B #1,REGY /* DEY */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op89: JMP (REGEMUL)
op8A: MOVE.B REGX,REGA /* TXA */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op8B: JMP (REGEMUL)
op8C: /* STY abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doSTY
op8D: /* STA abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doSTA
op8E: /* STX abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doSTX
op8F: JMP (REGEMUL)
op90: BTST #4,REGST /* BCC */
BNE nobcc /* BITX = 0x10 = bit #4 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobcc:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
op91: CLR.W REGEA /* STA (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
ADD.W REGY,REGEA
BRA doSTA
op92: JMP (REGEMUL)
op93: JMP (REGEMUL)
op94: CLR.W REGEA /* STY zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGY,(REGMEA)
JMP (REGEMUL)
op95: CLR.W REGEA /* STA zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGA,(REGMEA)
JMP (REGEMUL)
op96: CLR.W REGEA /* STX zp,Y */
MOVE.B (REGMPC)+,REGEA
ADD.B REGY,REGEA
MOVE.L REGEA,REGMEA
MOVE.B REGX,(REGMEA)
JMP (REGEMUL)
op97: JMP (REGEMUL)
op98: MOVE.B REGY,REGA /* TYA */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
op99: /* STA abs,Y */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doSTA
op9A: MOVE.B REGX,REGSP /* TXS */
JMP (REGEMUL)
op9B: JMP (REGEMUL)
op9C: JMP (REGEMUL)
op9D: /* STA abs,X */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doSTA
op9E: JMP (REGEMUL)
op9F: JMP (REGEMUL)
opA0: MOVE.B (REGMPC)+,REGY /* LDY # */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opA1: CLR.W REGEA /* LDA (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
BRA doLDA
opA2: MOVE.B (REGMPC)+,REGX /* LDX # */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opA3: JMP (REGEMUL)
opA4: CLR.W REGEA /* LDY zp */
MOVE.B (REGMPC)+,REGEA
BRA LDYread
opA5: CLR.W REGEA /* LDA zp */
MOVE.B (REGMPC)+,REGEA
BRA LDAread
opA6: CLR.W REGEA /* LDX zp */
MOVE.B (REGMPC)+,REGEA
BRA LDXread
opA7: JMP (REGEMUL)
opA8: MOVE.B REGA,REGY /* TAY */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opA9: MOVE.B (REGMPC)+,REGA /* LDA # */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opAA: MOVE.B REGA,REGX /* TAX */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opAB: JMP (REGEMUL)
opAC: /* LDY abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doLDY
opAD: /* LDA abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doLDA
opAE: /* LDX abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doLDX
opAF: JMP (REGEMUL)
opB0: BTST #4,REGST /* BCS */
BEQ nobcs /* BITX= 0x10 = bit #4 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobcs:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
opB1: CLR.W REGEA /* LDA (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
ADD.W REGY,REGEA
BRA doLDA
opB2: JMP (REGEMUL)
opB3: JMP (REGEMUL)
opB4: CLR.W REGEA /* LDY zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA LDYread
opB5: CLR.W REGEA /* LDA zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA LDAread
opB6: CLR.W REGEA /* LDX zp,Y */
MOVE.B (REGMPC)+,REGEA
ADD.B REGY,REGEA
BRA LDXread
opB7: JMP (REGEMUL)
opB8: ANDI.B #~BITV,REGST /* CLV */
JMP (REGEMUL)
opB9: /* LDA abs,Y */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doLDA
opBA: MOVE.B REGSP,REGX /* TAX */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opBB: JMP (REGEMUL)
opBC: /* LDY abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doLDY
opBD: /* LDA abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doLDA
opBE: /* LDX abs,Y */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doLDX
opBF: JMP (REGEMUL)
opC0: /* CPY # */
MOVE.B (REGMPC)+,DBUS
SUB.B REGY,DBUS
BEQ opC02
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opC02:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opC1: CLR.W REGEA /* CMP (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMEA),REGEA /* get lo byte */
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opC12
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opC12:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opC2: JMP (REGEMUL)
opC3: JMP (REGEMUL)
opC4: CLR.W REGEA /* CPY zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGY,DBUS
BEQ opC42
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opC42:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opC5: CLR.W REGEA /* CMP zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opC52
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opC52:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opC6: CLR.W REGEA /* DEC zp */
MOVE.B (REGMPC)+,REGEA
BRA doDEC
opC7: JMP (REGEMUL)
opC8: ADDQ.B #1,REGY /* INY */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opC9: /* CMP # */
MOVE.B (REGMPC)+,DBUS
SUB.B REGA,DBUS
BEQ opC92
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opC92:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opCA: SUBQ.B #1,REGX /* DEX */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opCB: JMP (REGEMUL)
opCC: /* CPY abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGY,DBUS
BEQ opCC2
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opCC2:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opCD: /* CMP abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opCD2
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opCD2:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opCE: /* DEC abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doDEC
opCF: JMP (REGEMUL)
opD0: BTST #2,REGST /* BNE */
BNE nobne /* BITZ = 0x04 = bit #2 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobne:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
opD1: CLR.W REGEA /* CMP (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
ADD.W REGY,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opD12
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opD12:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opD2: JMP (REGEMUL)
opD3: JMP (REGEMUL)
opD4: JMP (REGEMUL)
opD5: CLR.W REGEA /* CMP zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opD52
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opD52:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opD6: CLR.W REGEA /* DEC zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doDEC
opD7: JMP (REGEMUL)
opD8: ANDI.B #~BITD,REGST /* CLD */
JMP (REGEMUL)
opD9: /* CMP abs,Y */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opD92
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opD92:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opDA: JMP (REGEMUL)
opDB: JMP (REGEMUL)
opDC: JMP (REGEMUL)
opDD: /* CMP abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGA,DBUS
BEQ opDD2
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opDD2:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opDE: /* DEC abs,X */
MOVE.B 1(REGMPC),-(SP) /* get hi byte */
MOVE.W (SP)+,REGEA /* and shift by 8 */
MOVE.B (REGMPC),REGEA /* get lo byte */
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doDEC
opDF: JMP (REGEMUL)
opE0: /* CPX # */
MOVE.B (REGMPC)+,DBUS
SUB.B REGX,DBUS
BEQ opE02
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opE02:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opE1: CLR.W REGEA /* SBC (zp,X) */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
BRA doSBC
opE2: JMP (REGEMUL)
opE3: JMP (REGEMUL)
opE4: CLR.W REGEA /* CPX zp */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGX,DBUS
BEQ opE42
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opE42:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opE5: CLR.W REGEA /* SBC zp */
MOVE.B (REGMPC)+,REGEA
BRA doSBC
opE6: CLR.W REGEA /* INC zp */
MOVE.B (REGMPC)+,REGEA
BRA doINC
opE7: JMP (REGEMUL)
opE8: ADDQ.B #1,REGX /* INX */
MOVE.W SR,DBUS
AND.B #(BITN|BITZ),DBUS
AND.B #~(BITN|BITZ),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opE9: /* SBC # */
MOVE.B (REGMPC)+,DBUS
EORI.B #BITX,REGST
ORI.B #BITZ,REGST /* SUBX doesn't set Z flag */
MOVE.B REGST,CCR
SUBX.B DBUS,REGA
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX|BITV),DBUS
EORI.B #BITX,DBUS
AND.B #~(BITN|BITZ|BITX|BITV),REGST
OR.B DBUS,REGST
JMP (REGEMUL)
opEA: JMP (REGEMUL)
opEB: JMP (REGEMUL)
opEC: /* CPX abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
MOVE.L REGEA,REGMEA
MOVE.B (REGMEA),DBUS
SUB.B REGX,DBUS
BEQ opEC2
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
EORI.B #BITN,DBUS /* why?? why?? */
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
ADD.B DBUS,DBUS /* Shift BITZ into BITX */
AND.B #(BITX),DBUS /* if result of compare was zero */
OR.B DBUS,REGST /* carry flag must be set */
JMP (REGEMUL)
opEC2:
MOVE.W SR,DBUS
AND.B #(BITN|BITZ|BITX),DBUS
AND.B #~(BITN|BITZ|BITX),REGST
OR.B DBUS,REGST
ADD.B DBUS,DBUS
ADD.B DBUS,DBUS
AND.B #(BITX),DBUS
OR.B DBUS,REGST
JMP (REGEMUL)
opED: /* SBC abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doSBC
opEE: /* INC abs */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADDQ.W #2,REGMPC
BRA doINC
opEF: JMP (REGEMUL)
opF0: BTST #2,REGST /* BEQ */
BEQ nobeq /* BITZ = 0x04 = bit #2 */
MOVE.B (REGMPC)+,DBUS
EXT.W DBUS
ADDA.W DBUS,REGMPC
JMP (REGEMUL)
nobeq:
ADDQ.L #1,REGMPC
JMP (REGEMUL)
opF1: CLR.W REGEA /* SBC (zp),Y */
MOVE.B (REGMPC)+,REGEA
MOVE.L REGEA,REGMEA
MOVE.B 1(REGMEA),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMEA),REGEA
ADD.W REGY,REGEA
BRA doSBC
opF2: JMP (REGEMUL)
opF3: JMP (REGEMUL)
opF4: JMP (REGEMUL)
opF5: CLR.W REGEA /* SBC zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doSBC
opF6: CLR.W REGEA /* INC zp,X */
MOVE.B (REGMPC)+,REGEA
ADD.B REGX,REGEA
BRA doINC
opF7: JMP (REGEMUL)
opF8: ORI.B #BITD,REGST /* SED */
JMP (REGEMUL)
opF9: /* SBC abs,Y */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGY,REGEA
ADDQ.W #2,REGMPC
BRA doSBC
opFA: JMP (REGEMUL)
opFB: JMP (REGEMUL)
opFC: JMP (REGEMUL)
opFD: /* SBC abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doSBC
opFE: /* INC abs,X */
MOVE.B 1(REGMPC),-(SP)
MOVE.W (SP)+,REGEA
MOVE.B (REGMPC),REGEA
ADD.W REGX,REGEA
ADDQ.W #2,REGMPC
BRA doINC
opFF: JMP (REGEMUL)
}
}